﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ICSharpCode.SharpZipLib;
using ICSharpCode.SharpZipLib.Checksums;
using System.IO;
using ICSharpCode.SharpZipLib.Zip;
using System.Collections;

namespace VCommons.ZipHelper
{
    /// <summary>
    /// 文件压缩
    /// </summary>
    public class ZIP
    {
        public ZIP()
        {

        }

        /// <summary>
        /// 压缩文件
        /// </summary>
        /// <param name="path">压缩文件名称集合</param>
        /// <param name="destFileName">压缩后文件名称</param>
        public static void ZipFile(string path, string destFileName)
        {
            Crc32 crc = new Crc32();
            ZipOutputStream s = new ZipOutputStream(File.Create(destFileName));
            s.Password = "";
            s.SetLevel(6); // 0 - store only to 9 - means best compression
            //定义
            System.IO.DirectoryInfo myDir = new DirectoryInfo(path);
            System.IO.FileInfo[] myFileAry;
            if (myDir.Exists == true)
            {
                myFileAry = myDir.GetFiles();
            }
            else
            {
                myFileAry = new FileInfo[] { new FileInfo(path) };
            }
            //循环提取文件夹下每一个文件,提取信息,
            foreach (FileInfo objFiles in myFileAry)
            {
                FileStream fs = File.OpenRead(objFiles.FullName);
                byte[] buffer = new byte[fs.Length];
                fs.Read(buffer, 0, buffer.Length);
                ZipEntry entry = new ZipEntry(objFiles.FullName);
                entry.DateTime = DateTime.Now;
                entry.Size = fs.Length;
                fs.Close();
                crc.Reset();
                crc.Update(buffer);
                entry.Crc = crc.Value;
                s.PutNextEntry(entry);
                s.Write(buffer, 0, buffer.Length);
            }
            s.Finish();
            s.Close();

        }

        /// <summary>
        /// 解压文件
        /// </summary>
        /// <param name="sourceFileName">被解压文件名称</param>
        /// <param name="destPath">解压后文件目录</param>
        /// <param name="password">密码</param>
        public static void UnZipFile(string sourceFileName, string destPath)
        {
            ZipInputStream s = new ZipInputStream(File.OpenRead(sourceFileName));
            ZipEntry theEntry;
            ArrayList al = new ArrayList();

            while ((theEntry = s.GetNextEntry()) != null)
            {
                string fileName = Path.GetFileName(theEntry.Name);
                if (fileName != "")
                {
                    fileName = destPath + "\\" + fileName;
                    if (!Directory.Exists(destPath))
                    {
                        Directory.CreateDirectory(destPath);
                    }
                    FileStream streamWriter = File.Create(fileName);
                    int size = 2048;
                    byte[] data = new byte[2048];
                    s.Password = "";
                    while (true)
                    {
                        size = s.Read(data, 0, data.Length);
                        if (size > 0)
                        {
                            streamWriter.Write(data, 0, size);
                        }
                        else
                        {
                            break;
                        }
                    }
                    streamWriter.Close();
                }

            }
            s.Close();

        }
    }
}
